]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
AppDisplay: fix folder popup arrow
authorGiovanni Campagna <gcampagna@src.gnome.org>
Wed, 20 Feb 2013 13:13:46 +0000 (14:13 +0100)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Wed, 20 Feb 2013 15:04:54 +0000 (16:04 +0100)
The arrow origin must be in the coordinate space of the box pointer,
but it cannot be calculated when the box pointer is shown, because it's
not allocated yet, so pass the source to the boxpointer and adjust
the arrow at the next paint.

https://bugzilla.gnome.org/show_bug.cgi?id=694264

js/ui/appDisplay.js
js/ui/boxpointer.js

index c38e328b0f7bee7edcb4511ed1e4c30a382840c6..c247189eb9669fe3ee3cc3c4dc40bc713b1fe295 100644 (file)
@@ -648,7 +648,8 @@ const AppFolderPopup = new Lang.Class({
             return;
 
         this.actor.show();
-        this._boxPointer.setArrowOrigin(this._source.actor.x + this._source.actor.width / 2);
+
+        this._boxPointer.setArrowActor(this._source.actor);
         this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
                               BoxPointer.PopupAnimation.SLIDE);
 
index 233432e5f1a5958d794924276c54ee0bfa4339bc..9f85e0254d483660fa564122137e6db20e9c17d6 100644 (file)
@@ -38,6 +38,7 @@ const BoxPointer = new Lang.Class({
         this._arrowSide = arrowSide;
         this._userArrowSide = arrowSide;
         this._arrowOrigin = 0;
+        this._arrowActor = null;
         this.actor = new St.Bin({ x_fill: true,
                                   y_fill: true });
         this._container = new Shell.GenericContainer();
@@ -228,6 +229,19 @@ const BoxPointer = new Lang.Class({
     _drawBorder: function(area) {
         let themeNode = this.actor.get_theme_node();
 
+        if (this._arrowActor) {
+            let [sourceX, sourceY] = this._arrowActor.get_transformed_position();
+            let [sourceWidth, sourceHeight] = this._arrowActor.get_transformed_size();
+            let [absX, absY] = this.actor.get_transformed_position();
+
+            if (this._arrowSide == St.Side.TOP ||
+                this._arrowSide == St.Side.BOTTOM) {
+                this._arrowOrigin = sourceX - absX + sourceWidth / 2;
+            } else {
+                this._arrowOrigin = sourceY - absY + sourceHeight / 2;
+            }
+        }
+
         let borderWidth = themeNode.get_length('-arrow-border-width');
         let base = themeNode.get_length('-arrow-base');
         let rise = themeNode.get_length('-arrow-rise');
@@ -537,6 +551,16 @@ const BoxPointer = new Lang.Class({
         }
     },
 
+    // @actor: an actor relative to which the arrow is positioned.
+    // Differently from setPosition, this will not move the boxpointer itself,
+    // on the arrow
+    setArrowActor: function(actor) {
+        if (this._arrowActor != actor) {
+            this._arrowActor = actor;
+            this._border.queue_repaint();
+        }
+    },
+
     _shiftActor : function() {
         // Since the position of the BoxPointer depends on the allocated size
         // of the BoxPointer and the position of the source actor, trying